/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once

#include "../节点.h"


class C_节点树;


class C_组输入节点 : public C_节点基类 {
	cpp友员 class C_包节点;
protected:
	C_节点基类*		m_容器节点;

public:
	C_组输入节点(PyObject* blNode);
	//void	f_add插座(C_插座基类* s, E_插座输出方向 方向);
	//void	f_del插座(const string name, E_插座输出方向 方向);
	void	f_update();

	C_节点基类*	f_get上层节点();
};


class C_组输出节点 : public C_节点基类 {
	cpp友员 class C_包节点;
protected:
	C_节点基类*		m_容器节点;

public:
	C_组输出节点(PyObject* blNode);
	//void	f_add插座(C_插座基类* s, E_插座输出方向 方向);
	//void	f_del插座(const string name, E_插座输出方向 方向);
	void		f_update();
	C_节点基类*	f_get上层节点();

	void		f_释放数据();
};



class C_迭代器节点 : public C_节点基类 {

protected:
	
	E_插座类型	m_数据类型;
public:
	C_迭代器节点(PyObject* blNode);

	//C_节点树*	m_节点树;

	int32	m_迭代ID;
	uint32	m_迭代次数;

	void		f_bl节点数据传入(PyObject* bl_data);
	PyObject*	f_get节点bl数据(PyObject* bl_data = 0);
	void		f_update();
	void		f_迭代();
};







class C_跳出循环节点 : public C_节点基类 {

protected:
	E_插座类型	m_数据类型;
	C_节点树*	m_节点树;
public:
	C_跳出循环节点(PyObject* blNode);



	void		f_bl节点数据传入(PyObject* bl_data);
	PyObject*	f_get节点bl数据(PyObject* bl_data = 0);
	void		f_update();
	void		f_迭代();
};








class C_包节点 : public C_节点基类 {

protected:
	C_节点树*	m_节点树;
	PyObject*	m_BL节点树;

	C_节点树*	f_get实例树();

public:
	C_包节点(PyObject* blNode, E_节点类型 type);


	C_节点基类*		m_NodeGroupIuput;
	C_节点基类*		m_NodeGroupOutput;

	C_迭代器节点*	m_迭代器节;


	void		f_add插座(C_插座基类* s, E_插座输出方向 方向);
	void		f_del插座(const std::string name, E_插座输出方向 方向);
	bool		f_移动插座(E_插座输出方向 方向, E_方向 上下, int16 step);


	void		f_bl节点数据传入(PyObject* bl_data);
	PyObject*	f_get节点bl数据(PyObject* bl_data = 0);
	void		f_update();
	void		f_update输入节点();
	void		f_update输出节点();

	C_节点基类*	f_get上层节点();




	C_节点基类*	f_创建实例();
	//void		f_取实例树();
	std::string	f_编译();

};





















class C_函数节点 : public C_包节点 {
public:
	C_函数节点(PyObject* blNode);

	void	f_update();
};








class C_循环节点 : public C_包节点 {
public:
	C_循环节点(PyObject* blNode);

	void	f_update();
};






